import axios from "axios";

// 创建一个 Axios 实例
const instance = axios.create({
  baseURL: "http://8.130.46.189:3000", // 根据实际情况配置你的基础URL
  timeout: 3000, // 设置超时时间
});

let isRefreshing = false; // 是否正在刷新 Token
let refreshSubscribers = []; // 用于保存等待刷新的请求

// 在请求发送前拦截器中添加 AccessToken 到请求头
instance.interceptors.request.use(
  (config) => {
    const token = sessionStorage.getItem("token");
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 在响应拦截器中处理 AccessToken 过期
instance.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    const originalRequest = error.config;

    // 如果返回的状态码是 401 并且请求未重试过
    if (error.response.status === 401 && !originalRequest._retry) {
      if (isRefreshing) {
        // 如果正在刷新 Token，则将请求添加到刷新队列中
        return new Promise(function (resolve) {
          refreshSubscribers.push((token) => {
            originalRequest.headers.Authorization = `Bearer ${token}`;
            resolve(instance(originalRequest));
          });
        });
      }

      // 设置正在刷新 Token 的标志为 true，并标记请求已重试
      isRefreshing = true;
      originalRequest._retry = true;
      const refreshToken = sessionStorage.getItem("refreshToken");

      // 发送请求刷新 Token
      return axios
        .post("/refresh-token", { refreshToken })
        .then((response) => {
          const { accessToken, refreshToken } = response.data;
          // 更新 Token 到本地存储
          sessionStorage.setItem("token", accessToken);
          sessionStorage.setItem("refreshToken", refreshToken);
          // 更新请求头中的 Token
          originalRequest.headers.Authorization = `Bearer ${accessToken}`;
          // 执行刷新队列中的请求
          refreshSubscribers.forEach((callback) => callback(accessToken));
          refreshSubscribers = [];
          return instance(originalRequest);
        })
        .catch((error) => {
          // 处理刷新令牌失败的情况
          return Promise.reject(error);
        })
        .finally(() => {
          // 刷新完成，重置标志位
          isRefreshing = false;
        });
    }
    return Promise.reject(error);
  }
);

// 导出 Axios 实例
export default instance;
